package com.power.sifa.approve.service;

import com.plf.common.exception.BusinessException;
import com.power.sifa.approve.model.Apl_main;
import com.power.sifa.approve.model.pageInfo.Apl_mainPageInfo;
import com.power.sifa.statistics.model.vo.BaseCountVO;
import com.power.sifa.statistics.model.vo.BaseGraphVO;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 业务申请主表业务层
 */
public interface Apl_mainService {

    /**
     * 根据id获取业务申请主表对象
     */
    Apl_main getById(Serializable id);

    /**
     * 根据传入业务申请主表对象进行新增或更新操作
     */
    void saveOrUpdate(Apl_main apl_main);

    /**
     * 根据id删除业务申请主表
     */
    void removeById(Serializable id);

    /**
     * 根据传入条件查询业务申请主表分页结果
     */
    Page<Apl_main> findAll(Apl_mainPageInfo pageInfo);

    /**
     * 查询全部业务申请主表
     */
    List<Apl_main> findAll();

    /**
     * 根据id批量删除业务申请主表
     */
    void removeByIds(List<Integer> list);

    /**
     * 批量保存业务申请主表
     */
    void saveAll(List<Apl_main> list);

    /**
     * 根据流程实例查询
     */
    Apl_main getByInstid(@RequestParam String instid);

    /**
     * 根据流程实例批量查询
     *
     * @param instids
     * @return
     */
    List<Apl_main> getByInstids(@RequestBody List<String> instids);

    /**
     * 更新办结环节组
     *
     * @param instid
     * @param scatid
     * @return
     */
    void updateScatid(@RequestParam String instid, @RequestParam String scatid);

    /**
     * 启动子流程初始化申请主表对象
     *
     * @param userid     发起人id
     * @param processkey 流程模型key
     * @return
     */
    Apl_main createMain(String userid, String processkey, Apl_main faMainObj, String matid) throws BusinessException;

    /**
     * 更新主表状态
     *
     * @param id
     * @param status
     */
    void updateStatus(String id, Integer status);

    /**
     * 更新主表状态和办结时间
     *
     * @param id
     * @param status
     * @param finishtime
     */
    void updateStatusAndFinishtime(String id, Integer status, String finishtime);


    /**
     * 自动产生受理号
     * 格式: YYYYMMDD受第00000号
     *
     * @return
     */
    String generateAcceptCode();

    /**
     * 自动产生不予受理号
     * 格式: 赣药监受理《YYYYMMDD》000号
     *
     * @return
     */
    String generateStopCode();

    /**
     * 更新业务主表状态和备份异常状态
     *
     * @param id
     * @param status
     */
    void updateStatusAndCp(String id, Integer status, Integer statuscp);

    /**
     * 根据流程实例id批量更新状态
     *
     * @param status
     * @param instids
     */
    void updateStatusByInstid(Integer status, List<String> instids);

    /**
     * 通过案号查询对应的业务申请主表数据
     */
    Apl_main getOneByAcceptcode(String acceptcode);

    /**
     * 通过案号查询对应的业务申请主表数据
     */
    List<Apl_main> getListByAcceptcode(String acceptcode);

    /**
     * 更新主表受理时间
     *
     * @param id
     * @param accepttime
     */
    void updateAccepttime(String id, String accepttime);

    /**
     * 根据状态统计主流程总数
     * @param status
     */
    Integer countByStatus(List<String> status);

    /**
     * 根据userid和状态统计我完成的业务总数
     * @param userid
     * @param status
     * @return
     */
    Integer countByUserAndStatus(String userid, List<String> status);

    /**
     *  查询指定业务分派树
     * @param departList
     * @return
     */
    List<Map<String, Object>> queryUserTreeByDepartids(List<String> departList);

    /**
     * 查询业务分派树
     * @param applyid
     * @param departid
     * @return
     */
    List<Map<String, Object>> queryBusineTree(String applyid, String departid);

    /**
     * 根据状态查询业务申请主表
     * @param status
     * @return
     */
    List<Apl_main> getListByStatus(List<String> status);

    /**
     * 查询复议案件情况
     * @param acceptadid
     * @return
     */
    List<BaseCountVO> caseStatus(String acceptadid);

    /**
     * 统计前一年年月度收案情况
     *
     * @param acceptadid
     * @return
     */
    List<BaseCountVO> caseReceptionStatus(String acceptadid, String year);

    /**
     * 统计案件类型
     * @param acceptadid
     * @return
     */
    BaseGraphVO countCaseType(String acceptadid, String year);

    /**
     * 统计前一年结案情况
     *
     * @param acceptadid
     * @param year
     * @return
     */
    List<BaseCountVO> countClosingType(String acceptadid, String year);
    Map<String, List<BaseCountVO>> countClosing(String acceptadid, String year);

    /**
     * 大屏统计--收案数据统计
     *
     * @param acceptadid
     * @return
     * @throws BusinessException
     */
    List<BaseCountVO> countReceiptData(String acceptadid);
}
